package com.pb.wkflow.core.service;

import com.pb.wkflow.api.controller.request.ProcessTaskRequest;
import com.pb.wkflow.core.entity.ActHiTaskEntity;
import org.camunda.bpm.engine.history.HistoricTaskInstance;
import org.camunda.bpm.engine.runtime.ProcessInstance;
import org.camunda.bpm.engine.task.Comment;
import org.camunda.bpm.engine.task.Task;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 任务服务
 * @author 苗益辉
 * @date 2022/6/20 21:33
 */
 public interface WorkflowTaskService {

    /**
     * 设置任务意见
     * @param taskId 任务id
     * @param comment 意见
     * @param processInstanceId 流程实例id
     */
     void setTaskComment(String taskId, String comment, String processInstanceId);

    /**
     * 查询任务意见
     * @param taskId 任务id
     * @return List<Comment>
     */
     List<Comment> findTaskComments(String taskId);

    /**
     * 查询进行中的任务列表
     * @param processInstanceId 实例id
     * @return List<Task
     */
     List<Task> findTaskList(String processInstanceId);

    /**
     * 根据任务id查询任务信息
     * @param taskId 任务id
     * @return Task
     */
     Task findTask(String taskId);

    /**
     * 根据流程id查询任务信息
     * @param procDefineId 流程id
     * @return List<Task>
     */
     List<Task> findTaskByProcDefineId(String procDefineId);

    /**
     * 设置任务处理人
     * @param userId 处理人
     * @param taskId 任务id
     */
     void setAssignee(String taskId, String userId);

    /**
     * 删除流程
     * @param processInstanceId 流程实例id
     * @param deleteReason 删除原因
     */
     void deleteProcessInstance(String processInstanceId, String deleteReason);

    /**
     * 设置任务本地流程变量
     * @param taskId 任务id
     * @param variableLocal 本地流程变量
     */
     void setTaskVariableLocal(String taskId, Map<String, Object> variableLocal);

    /**
     * 设置任务流程变量
     * @param taskId 任务id
     * @param variables 全局流程变量
     */
     void setTaskVariables(String taskId,Map<String, Object> variables);

    /**
     * 领取任务
     * @param taskId 任务id
     * @param userId 处理用户
     */
     void claimTask(String taskId, String userId);

    /**
     * 完成任务
     * @param taskId 任务id
     */
     void completeTask(String taskId);

    /**
     * 查询流程实例信息
     * @param processInstanceId 流程实例id
     * @return 流程实例信息
     */
     ProcessInstance findProcess(String processInstanceId);

    /**
     * 审批通过
     * @param taskId 任务id
     * @param variables 流程变量
     */
     void passProcess(String taskId, Map<String, Object> variables);

    /**
     * 提交任务
     * @param taskId 任务id
     * @param variables 流程变量
     * @param activityId 流程转向执行任务节点，默认提交
     */
     void commitProcess(String taskId, Map<String, Object> variables, String activityId);

    /**
     * 查询任务是否可以领取或者已被当前用户领取
     * @param userId 用户id
     * @param taskId 任务id
     */
     void checkAndClaimTask(String userId, String taskId);

    /**
     * 提交任务
     * @param request request
     */
    void submitTask(ProcessTaskRequest request);

    /**
     * 根据任务id查询已完成的任务
     * @param taskId 任务id
     * @return HistoricTaskInstance
     */
    HistoricTaskInstance findHistoricTask(String taskId);

    /**
     * 查询任务本地变量
     * @param taskId 任务id
     * @param key 键值
     * @return Object
     */
    Object getVariableLocal(String taskId, String key);

    /**
     * 设置任务本地变量
     * @param taskId 任务id
     * @param key 键
     * @param value 值
     * @return Object
     */
    void setVariableLocalByKey(String taskId, String key, Object value);

    /**
     * 删除任务本地变量
     * @param taskId 任务id
     * @param key 键
     */
    void removeVariableLocal(String taskId, String key);
}
